<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C语言基础 - 函数</title>
    <link rel="stylesheet" href="common.css">
    <style>
        /* 页面特有样式 */
        .function-card {
            background-color: #f5f9ff;
            border-radius: 8px;
            padding: 20px;
            margin-bottom: 25px;
            border-left: 4px solid #5D9CEC;
        }
        
        .definition-box {
            background-color: #f0f7ff;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .parameter-box {
            background-color: #fff3e0;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .return-box {
            background-color: #e8f5e9;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .example-box {
            background-color: #f8f8f8;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .warning-note {
            background-color: #ffebee;
            border-left: 4px solid #f44336;
            padding: 12px;
            margin: 15px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>C语言基础入门课程</h1>
        </header>
        
        <nav>
            <a href="index.html">首页</a>
            <a href="02-intro.html">C语言简介与环境搭建</a>
            <a href="03-structure.html" class="current">C程序结构</a>
            <a href="04-datatypes.html">基本数据类型</a>
            <a href="05-variables.html">变量与常量</a>
            <a href="06-operators.html">运算符</a>
            <a href="07-io.html" class="current">输入输出</a>
            <a href="08-conditionals.html">条件语句</a>
            <a href="09-loops.html">循环结构</a>
            <a href="10-functions.html" class="current">函数基础</a>
            <a href="11-scope.html">作用域与存储类</a>
            <a href="12-recursion.html">递归函数</a>
            <a href="13-arrays.html">一维数组</a>
            <a href="14-multidim.html" class="current">多维数组</a>
            <a href="15-strings.html">字符串处理</a>
            <a href="16-pointers.html">指针基础</a>
            <a href="17-pointers_advanced.html" class="current">指针进阶</a>
            <a href="18-structs.html">结构体</a>
            <a href="19-files.html">文件操作</a>
            <a href="20-project.html">综合项目</a>
        </nav>
        
        <main>
            <h2>C语言函数基础</h2>
            
            <section>
                <h3>函数概述</h3>
                <p>函数是C语言的基本构建块，用于封装可重用的代码逻辑，提高代码的模块化和可维护性。</p>
            </section>
            
            <div class="function-card">
                <h3>1. 函数定义与调用</h3>
                
                <div class="definition-box">
                    <h4>函数定义语法</h4>
                    <pre><code>返回类型 函数名(参数列表) {
    // 函数体
    // 可选的return语句
}</code></pre>
                    
                    <h4>函数调用语法</h4>
                    <pre><code>函数名(实际参数);</code></pre>
                </div>
                
                <div class="example-box">
                    <h4>示例：计算两数之和</h4>
                    <pre><code>#include &lt;stdio.h&gt;

// 函数定义
int add(int a, int b) {
    return a + b;
}

int main() {
    int num1 = 5, num2 = 3;
    
    // 函数调用
    int sum = add(num1, num2);
    
    printf("%d + %d = %d\n", num1, num2, sum);
    return 0;
}</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>函数声明(原型)</h4>
                    <p>在使用函数前应提供声明，通常在头文件或文件开头：</p>
                    <pre><code>// 函数声明(告诉编译器函数的存在)
int add(int a, int b);</code></pre>
                    <p>如果函数定义在使用前，可以省略声明。</p>
                </div>
            </div>
            
            <div class="function-card">
                <h3>2. 参数传递</h3>
                
                <div class="parameter-box">
                    <h4>C语言的参数传递方式</h4>
                    <p>C语言只有<strong>值传递</strong>，即函数接收的是实参的副本。</p>
                    
                    <h4>基本类型参数传递</h4>
                    <pre><code>void modify(int x) {
    x = 100;  // 只修改局部副本
}

int main() {
    int num = 5;
    modify(num);
    printf("%d", num);  // 输出5，原值未改变
    return 0;
}</code></pre>
                </div>
                
                <div class="parameter-box">
                    <h4>模拟引用传递(使用指针)</h4>
                    <pre><code>void modify(int *x) {
    *x = 100;  // 通过指针修改原变量
}

int main() {
    int num = 5;
    modify(&num);
    printf("%d", num);  // 输出100，原值已改变
    return 0;
}</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>数组作为参数</h4>
                    <p>数组名作为参数时，实际传递的是数组首元素的地址：</p>
                    <pre><code>void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int nums[] = {1, 2, 3, 4, 5};
    printArray(nums, 5);  // 传递数组名和大小
    return 0;
}</code></pre>
                    <p>等价于：<code>void printArray(int *arr, int size)</code></p>
                </div>
            </div>
            
            <div class="function-card">
                <h3>3. 返回值</h3>
                
                <div class="return-box">
                    <h4>返回基本类型</h4>
                    <pre><code>// 返回两个数中的较大值
int max(int a, int b) {
    return a > b ? a : b;
}</code></pre>
                    
                    <h4>返回指针</h4>
                    <pre><code>// 返回字符串中第一个空格的位置
char* findSpace(char *str) {
    while (*str != '\0') {
        if (*str == ' ') {
            return str;
        }
        str++;
    }
    return NULL;  // 没找到返回空指针
}</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>注意事项</h4>
                    <ul>
                        <li>不要返回局部变量的地址(函数结束时会销毁)</li>
                        <li>void函数可以没有return语句，或使用<code>return;</code></li>
                        <li>main函数通常返回0表示成功，非0表示错误</li>
                    </ul>
                </div>
                
                <div class="example-box">
                    <h4>综合示例：计算阶乘</h4>
                    <pre><code>#include &lt;stdio.h&gt;

// 函数声明
long factorial(int n);

int main() {
    int num;
    printf("请输入一个正整数: ");
    scanf("%d", &num);
    
    printf("%d! = %ld\n", num, factorial(num));
    return 0;
}

// 函数定义：递归计算阶乘
long factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}</code></pre>
                </div>
            </div>
            
            <section>
                <h3>函数最佳实践</h3>
                
                <div class="best-practice">
                    <h4>设计原则</h4>
                    <ul>
                        <li><strong>单一职责</strong>：一个函数只做一件事</li>
                        <li><strong>合理大小</strong>：函数体不宜过长(通常不超过一屏)</li>
                        <li><strong>明确命名</strong>：函数名应准确描述功能</li>
                        <li><strong>最少参数</strong>：参数不宜过多(通常不超过5个)</li>
                    </ul>
                </div>
                
                <div class="best-practice">
                    <h4>文档注释</h4>
                    <pre><code>/**
 * 计算两个整数的最大公约数
 * @param a 第一个整数
 * @param b 第二个整数
 * @return 两个整数的最大公约数
 */
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}</code></pre>
                </div>
            </section>
        </main>
        
        <footer>
             <p>&copy; </p>
        </footer>
        
        <!-- 二维码区域 -->

    </div> <!-- 结束.container -->
</body>
</html>